/*******************************************************************************
  * 文件：DevState.c
  * 作者：djy
  * 版本：v1.0.0
  * 日期：2020-11-27
  * 说明：设备应用层状态机
*******************************************************************************/
/* 头文件 *********************************************************************/
#include "DevState.h"
#include "DevRun.h"
//#include "DevError.h"
#include "DevStandby.h"
#include "Display.h"
#include "Buzzer.h"

/* 宏定义 *********************************************************************/
/* 类型定义 *******************************************************************/
/* 变量定义 *******************************************************************/
// 设备运行状态机
static StateMachine_ts sDevSM;
static DevCtrl_ts sDevCtrl;
/* 函数声明 *******************************************************************/
/* 函数定义 *******************************************************************/
/*******************************************************************************
  * 函数名：Dev_InitHandler
  * 功  能：整机运行-上电初始化处理
  * 参  数：无
  * 返回值：无
  * 说  明：上电前三秒：IPG Config
*******************************************************************************/
static U32 Dev_InitHandler(void)
{
    if(StateMachine_GetRetryCount(&sDevSM) == 0)
    {
        // 开机提示音
        Buzzer_Play(eBUZZER_SOUND_WELCOM,eBUZZER_VOL_HIGH);
        
        // 数码管全亮
        Display_ShowAll();
        
        // 重试此状态
        return STATE_CTRL_RETRY;
    }
    else if(StateMachine_GetRetryCount(&sDevSM) < 5)
    {     
        // 重试此状态
        return STATE_CTRL_RETRY;
    }
    else
    {
        return STATE_CTRL_NEXT;
    }
}

/*******************************************************************************
  * 函数名：Dev_PowerOffHandler
  * 功  能：整机运行-关机状态处理
  * 参  数：无
  * 返回值：无
  * 说  明：无
*******************************************************************************/
static U32 Dev_StandbyHandler(void)
{
    // 设备待机-开始 - 为了查找卡死原因
    DevStandby_Start();
    
    // 保持此状态
    return STATE_CTRL_HOLD;
}

/*******************************************************************************
  * 函数名：Dev_RunHandler
  * 功  能：整机运行-运行状态处理
  * 参  数：无
  * 返回值：无
  * 说  明：开机后前三秒检查IPG config
*******************************************************************************/
static U32 Dev_RunHandler(void)
{
    // 设备运行初始化
    DevRun_Init();

    // 保持此状态
    return STATE_CTRL_HOLD;
}

/*******************************************************************************
  * 函数名：Dev_ErrorHandler
  * 功  能：整机运行-故障状态处理
  * 参  数：无
  * 返回值：无
  * 说  明：无
*******************************************************************************/
static U32 Dev_ErrorHandler(void)
{
//    // 故障处理开始
//    DevErr_Start();
    
    // 保持此状态
    return STATE_CTRL_HOLD;
}

/*******************************************************************************
  * 函数名：Dev_SeflCheckHandler
  * 功  能：整机运行-整机自检模式处理
  * 参  数：无
  * 返回值：无
  * 说  明：无
*******************************************************************************/
static U32 Dev_SeflCheckHandler(void)
{
    // 自检模式开始

    // 保持此状态
    return STATE_CTRL_HOLD;;
}

/*******************************************************************************
  * 函数名：Dev_BoardheckHandler
  * 功  能：整机运行-板厂自检模式处理
  * 参  数：无
  * 返回值：无
  * 说  明：无
*******************************************************************************/
static U32 Dev_BoardCheckHandler(void)
{
    // 保持此状态
    return STATE_CTRL_HOLD;
}

// 状态表  按照业务逻辑划分状态机
static const StateMachineOps_ts asDevSMOpts[] =
{
    STATE_MACHINE_STATE(eDEV_INIT,          eDEV_STANDBY,       500,        Dev_InitHandler         ),
    STATE_MACHINE_STATE(eDEV_STANDBY,       eDEV_RUN,           0,          Dev_StandbyHandler      ),
    STATE_MACHINE_STATE(eDEV_RUN,           eDEV_STANDBY,       0,          Dev_RunHandler          ),
    STATE_MACHINE_STATE(eDEV_ERROR,         eDEV_STANDBY,       0,          Dev_ErrorHandler        ),
    STATE_MACHINE_STATE(eDEV_SELFCHECK,     eDEV_STANDBY,       0,          Dev_SeflCheckHandler    ),
    STATE_MACHINE_STATE(eDEV_BOARDCHECK,    eDEV_STANDBY,       0,          Dev_BoardCheckHandler   ),
};

/*******************************************************************************
  * 函数名：Dev_GetChildLock
  * 功  能：设置童锁状态
  * 参  数：Bool bChildLock：童锁状态
  * 返回值：无
  * 说  明：无
*******************************************************************************/
void Dev_SetChildLock(Bool bChildLock)
{
    sDevCtrl.bChildLock = bChildLock;
}

/*******************************************************************************
  * 函数名：Dev_GetChildLock
  * 功  能：获取童锁状态
  * 参  数：无
  * 返回值：童锁状态
  * 说  明：无
*******************************************************************************/
Bool Dev_GetChildLock(void)
{
    return sDevCtrl.bChildLock;
}

/*******************************************************************************
  * 函数名：Dev_StateChange
  * 功  能：整机运行状态切换
  * 参  数：DevState_te eState：整机运行状态
  * 返回值：无
  * 说  明：无
*******************************************************************************/
void Dev_ChangeState(DevState_te eState)
{
    StateMachine_Change(&sDevSM,eState);
}

/*******************************************************************************
  * 函数名：Dev_RecoverState
  * 功  能：整机运行状态恢复
  * 参  数：DevState_te eState：整机运行状态
  * 返回值：无
  * 说  明：无
*******************************************************************************/
void Dev_RecoverState(DevState_te eState)
{
    StateMachine_Recover(&sDevSM,eState);
}

/*******************************************************************************
  * 函数名：Dev_StateGet
  * 功  能：获取整机当前状态
  * 参  数：无
  * 返回值：DevState_te 整机当前状态枚举值
  * 说  明：无
*******************************************************************************/
U8 Dev_GetCurrentState(void)
{
    return (U8)StateMachine_GetCurState(&sDevSM);
}

/*******************************************************************************
  * 函数名：Dev_GetLastState
  * 功  能：获取整机上一状态
  * 参  数：无
  * 返回值：DevState_te 整机上一状态枚举值
  * 说  明：无
*******************************************************************************/
U8 Dev_GetLastState(void)
{
    return (U8)StateMachine_GetLastState(&sDevSM);
}

/*******************************************************************************
  * 函数名：DevState_Init
  * 功  能：设备状态初始化
  * 参  数：无
  * 返回值：无
  * 说  明：初始化状态机
*******************************************************************************/
void Dev_StateInit(void)
{
    // 状态机初始化
    StateMchine_Init(&sDevSM,"DevSM",asDevSMOpts,ARRAY_SIZE(asDevSMOpts));

    // 初始状态：设备初始化
    StateMachine_Change(&sDevSM,eDEV_INIT);
}

/***************************** 文件结束 ***************************************/

